From 531889de05511b2646f652d5f72e16601df75528 Mon Sep 17 00:00:00 2001 From: "kaf24@scramble.cl.cam.ac.uk" Date: Tue, 18 Jan 2005 11:03:57 +0000 Subject: [PATCH] bitkeeper revision 1.1159.223.1 (41eced1denT_MsS4LtXTQroXHucvZA) Fix small-packet delivery in netback driver. --- .../drivers/xen/netback/netback.c | 30 ++++++++----------- .../drivers/xen/netfront/netfront.c | 1 - 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/linux-2.6.10-xen-sparse/drivers/xen/netback/netback.c b/linux-2.6.10-xen-sparse/drivers/xen/netback/netback.c index d45b0c3f59..05b043c175 100644 --- a/linux-2.6.10-xen-sparse/drivers/xen/netback/netback.c +++ b/linux-2.6.10-xen-sparse/drivers/xen/netback/netback.c @@ -13,8 +13,8 @@ #include "common.h" #include +static void netif_idx_release(u16 pending_idx); static void netif_page_release(struct page *page); -static void netif_skb_release(struct sk_buff *skb); static void make_tx_response(netif_t *netif, u16 id, s8 st); @@ -411,7 +411,7 @@ static void net_tx_action(unsigned long unused) mcl[0].args[0] = MMAP_VADDR(pending_idx) >> PAGE_SHIFT; mcl[0].args[1] = 0; mcl[0].args[2] = 0; - mcl++; + mcl++; } mcl[-1].args[2] = UVMF_FLUSH_TLB; @@ -531,7 +531,7 @@ static void net_tx_action(unsigned long unused) pending_idx = pending_ring[MASK_PEND_IDX(pending_cons)]; - data_len = txreq.size > PKT_PROT_LEN ? PKT_PROT_LEN : txreq.size; + data_len = (txreq.size > PKT_PROT_LEN) ? PKT_PROT_LEN : txreq.size; if ( unlikely((skb = alloc_skb(data_len+16, GFP_ATOMIC)) == NULL) ) { @@ -592,14 +592,15 @@ static void net_tx_action(unsigned long unused) phys_to_machine_mapping[__pa(MMAP_VADDR(pending_idx)) >> PAGE_SHIFT] = FOREIGN_FRAME(txreq.addr >> PAGE_SHIFT); - data_len = txreq.size > PKT_PROT_LEN ? PKT_PROT_LEN : txreq.size; + data_len = (txreq.size > PKT_PROT_LEN) ? PKT_PROT_LEN : txreq.size; __skb_put(skb, data_len); memcpy(skb->data, (void *)(MMAP_VADDR(pending_idx)|(txreq.addr&~PAGE_MASK)), data_len); - if (data_len < txreq.size) { + if ( data_len < txreq.size ) + { /* Append the packet payload as a fragment. */ skb_shinfo(skb)->frags[0].page = virt_to_page(MMAP_VADDR(pending_idx)); @@ -607,10 +608,11 @@ static void net_tx_action(unsigned long unused) skb_shinfo(skb)->frags[0].page_offset = (txreq.addr + data_len) & ~PAGE_MASK; skb_shinfo(skb)->nr_frags = 1; - } else { - skb_shinfo(skb)->frags[0].page = - virt_to_page(MMAP_VADDR(pending_idx)); - skb->destructor = netif_skb_release; + } + else + { + /* Schedule a response immediately. */ + netif_idx_release(pending_idx); } skb->data_len = txreq.size - data_len; @@ -651,14 +653,6 @@ static void netif_page_release(struct page *page) netif_idx_release(pending_idx); } -static void netif_skb_release(struct sk_buff *skb) -{ - struct page *page = skb_shinfo(skb)->frags[0].page; - u16 pending_idx = page - virt_to_page(mmap_vstart); - - netif_idx_release(pending_idx); -} - irqreturn_t netif_be_int(int irq, void *dev_id, struct pt_regs *regs) { netif_t *netif = dev_id; @@ -747,7 +741,7 @@ static int __init netback_init(void) struct page *page; if ( !(xen_start_info.flags & SIF_NET_BE_DOMAIN) && - !(xen_start_info.flags & SIF_INITDOMAIN) ) + !(xen_start_info.flags & SIF_INITDOMAIN) ) return 0; printk("Initialising Xen netif backend\n"); diff --git a/linux-2.6.10-xen-sparse/drivers/xen/netfront/netfront.c b/linux-2.6.10-xen-sparse/drivers/xen/netfront/netfront.c index fd2cd0b900..61626a7b91 100644 --- a/linux-2.6.10-xen-sparse/drivers/xen/netfront/netfront.c +++ b/linux-2.6.10-xen-sparse/drivers/xen/netfront/netfront.c @@ -273,7 +273,6 @@ static int send_fake_arp(struct net_device *dev) dst_ip, dev, src_ip, /*dst_hw*/ NULL, /*src_hw*/ NULL, /*target_hw*/ dev->dev_addr); - printk(KERN_ALERT "ARP sent on %08x %08x %p\n", dst_ip, src_ip, skb); if ( skb == NULL ) return -ENOMEM; -- 2.30.2